7.2.5 启动一个简单容器

启动容器的一个简单的方式是通过 docker container run 命令。

下面的命令启动了一个简单的容器,其中运行了容器化版本的Ubuntu Linux。

$ docker container run -it ubuntu:latest /bin/bash
Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
952132ac251a: Pull complete
82659f8f1b76:  Pull complete
c19118ca682d:  Pull complete
8296858250fe:  Pull complete
24e0251a0e2c:  Pull complete
Digest: sha256:f4691c96e6bbaa99d9...e95a60369c506dd6e6f6ab
Status: Downloaded newer image for ubuntu:latest
root@3027eb644874:/#

Windows示例。

docker container run -it microsoft/powershell:nanoserver pwsh.exe

命令的基础格式为 docker container run <options> <im- age>:<tag> <app>

示例中使用 docker container ru n来启动容器,这也是启动新容器的标准命令。命令中使用了 -it 参数使容器具备交互性并与终端进行连接。接下来,命令中指定了具体镜像 ubuntu:latest 或者 microsoft/powershell:nanoserver 。最终,在命令中指定了运行在容器中的程序,Linux示例中是Bash Shell,Windows示例中为PowerShell。

当敲击 回车键 之后,Docker客户端选择合适的API来调用Docker daemon。Docker daemon接收到命令并搜索Docker本地缓存,观察是否有命令所请求的镜像。在上面引用的示例中,本地缓存并未包含该镜像,所以Docker接下来查询在Docker Hub中是否存在对应镜像。找到该镜像后,Docker将镜像拉取到本地,存储在本地缓存当中。

注:

在标准的、开箱即用的Linux安装版中,Docker daemon通过位于 /var/run/docker.sock 的本地IPC/Unix socket来实现Docker远程API;在Windows中,Docker daemon通过监听名为 npipe:////./pipe/docker_engine 的管道来实现。通过配置,也可以借助网络来实现Docker Client和daemon之间的通信。Docker默认非TLS网络端口为2375,TLS默认端口为2376。

一旦镜像拉取到本地,daemon就创建容器并在其中运行指定的应用。

如果仔细观察,就会发现Shell提示符发生了变化,说明目前已经位于容器内部了。在上面的示例中,Shell提示符已经变为 root@3027eb644874:/# 。@之后的一长串数字就是容器唯一ID的前12个字符。

若尝试在容器内执行一些基础命令,可能会发现某些指令无法正常工作。这是因为大部分容器镜像都是经过高度优化的。这意味着某些命令或者包可能没有安装。下面的示例展示了两个命令——一条执行成功,一条执行失败。

root@3027eb644874:/# ls -l
total 64
drwxr-xr-x   2 root root 4096 Aug 19 00:50 bin
drwxr-xr-x   2 root root 4096 Apr 12 20:14 boot
drwxr-xr-x   5 root root  380 Sep 13 00:47 dev
drwxr-xr-x  45 root root 4096 Sep 13 00:47 etc
drwxr-xr-x   2 root root 4096 Apr 12 20:14 home
drwxr-xr-x   8 root root 4096 Sep 13  2015 lib
drwxr-xr-x   2 root root 4096 Aug 19 00:50 lib64
drwxr-xr-x   2 root root 4096 Aug 19 00:50 media
drwxr-xr-x   2 root root 4096 Aug 19 00:50 mnt
drwxr-xr-x   2 root root 4096 Aug 19 00:50 opt
dr-xr-xr-x 129 root root    0 Sep 13 00:47 proc
drwx------   2 root root 4096 Aug 19 00:50 root
drwxr-xr-x   6 root root 4096 Aug 26 18:50 run
drwxr-xr-x   2 root root 4096 Aug 26 18:50 sbin
drwxr-xr-x   2 root root 4096 Aug 19 00:50 srv
dr-xr-xr-x  13 root root    0 Sep 13 00:47 sys
drwxrwxrwt   2 root root 4096 Aug 19 00:50 tmp
drwxr-xr-x  11 root root 4096 Aug 26 18:50 usr
drwxr-xr-x  13 root root 4096 Aug 26 18:50 var
root@3027eb644874:/# ping www.docker.com 
bash: ping: command not found

从上面的输出中可以看出, ping 工具包并不是官方Ubuntu镜像的一部分。

results matching ""

    No results matching ""